package com.cn.zpark;

import com.cn.zpark.utils.DBUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * @PackageName: com.cn.zpark
 * @ClassName: JdbcTransactionUpdate
 * @Description:
 * @author: RZS
 * @date: 2022/3/31  14:11
 */
public class JdbcTransactionUpdate {
    /**
     * 模拟转账业务
     */
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement stat1 = null; // 张三sql语句对象
        PreparedStatement stat2 = null; // 李四sql语句对象


        try {
            // 获取数据库连接对象
            conn = DBUtils.getConn();
            // 开启事务，关闭事务自动提交
            conn.setAutoCommit(false);// false表示关闭事务自动提交

            /**
             * 张三给李四转账
             */
            // 创建sql语句
            String sql1 = "update tab2 set money=? where uname=?";
            String sql2 = "update tab2 set money=? where uname=?";
            // 创建预编译对象
            stat1 = conn.prepareStatement(sql1);
            stat2 = conn.prepareStatement(sql2);
            // 替换占位符
            stat1.setDouble(1, 900);
            stat1.setString(2, "张三");

            stat2.setDouble(1, 1100);
            stat2.setString(2, "李四");

            // 执行sql
            stat1.executeUpdate();

            //int num = 5/0;

            stat2.executeUpdate();

            System.out.println("张三个李四转账100成功");

            // 提交事务
            conn.commit();

        } catch (Exception e) {
            e.printStackTrace();
            // 关闭事务
            try {
                if(conn != null){
                    conn.rollback();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }

        } finally {
            // 关闭资源
            DBUtils.close(conn, stat1, null);

            try {
                if(stat2 != null){
                    stat2.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }
}
